package com.kfm.advice;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Date;

@Aspect
@Component
public class AdviceConfig {
        private static final Log LOG = LogFactory.getLog(AdviceConfig.class);
       /*
        通知类
        要对方法的增强内容
     */

    //切入点

    @Pointcut("execution(* com.kfm.service..*.*(..))")
    public void pt(){};

//    @Before("pt()")
//    public void before(){
//        System.out.println("开始执行.....");
//    }
//
//    @AfterReturning("pt()")
//    public void returnMethod(){
//        System.out.println("方法返回了");
//    }
//
//    @AfterThrowing("pt()")
//    public void exceptionMethod(){
//        System.out.println("发生异常了");
//    }
//
//    @After("pt()")
//    public void after(){
//        System.out.println("结束执行");
//    }

    /**
     * 环绕通知不能和前置通知等一起使用
     * @param proceedingJoinPoint
     * @return
     */
    @Around("pt()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint){
        Object obj = null;
        String methodName = proceedingJoinPoint.getSignature().getName();
        String className = proceedingJoinPoint.getSignature().getDeclaringType().getName();
        String name = methodName + "." + className;
        try {
//            before();//前置通知
            //获取方法名
            LOG.info(methodName+"方法开始执行" + new Date());
            //执行方法
            obj = proceedingJoinPoint.proceed();
            System.out.println();
            LOG.info(name + "方法执行结束，返回值是" + obj);

//            returnMethod();//返回通知
        } catch (Throwable e) {
            e.printStackTrace();
            LOG.error(name + "在执行时发生了异常");
//            exceptionMethod();//异常通知
        }
        return obj;
    }
}
